<?php
/** 
 * Gateway de Compra
 * @author felipe 
 */
class App_Model_Db_Compra extends Voitech_Db {
	protected $_name = 'compra';
	protected $_primary = 'co_compra';
	
	static private $instancia;

	/**
	 * @return App_Model_Db_Compra
	 */
	static public function build() {
            if( !isset( self::$instancia ) ) {
                    $classe = __CLASS__;
                    self::$instancia = new $classe();
            }
            return self::$instancia;
	}
	
	/**
	 * Metodo que busca uma compra pelo id
	 * 
	 * @param int coCompra
	 * @return array
	 */
	public function buscarCompra($coCompra) {
		$obSelect = $this->getAdapter()->select()
		                               ->distinct()
		                               ->from(array('compra'=>'compra'))
		                               ->joinInner(array('tipocompra'=>'tipo_compra')
		                               			  ,'compra.co_tipo_compra = tipocompra.co_tipo_compra'
		                               			  ,array('no_tipo_compra'))
		                               ->joinInner(array('fornecedor'=>'fornecedor')
		                               			  ,'fornecedor.co_fornecedor = compra.co_fornecedor'
		                               			  ,array('no_fornecedor'
		                               			        ,'nu_cnpj'
		                               			        ,'nu_inscricao'
		                               			        ,'ds_endereco'
                                                                        ,'nu_telefone'
                                                                        ,'co_representante'))
		                               ->joinInner(array('representante'=>'pessoa')
		                               			  ,'representante.co_pessoa = fornecedor.co_representante'
		                               			  ,array('no_representante'=>'no_pessoa'
		                               			        ,'nu_cpf_representante'=>'nu_cpf'))
		                               ->joinInner(array('usuario'=>'pessoa')
		                               			  ,'usuario.co_pessoa = compra.co_pessoa'
		                               			  ,array('co_usuario'=>'co_pessoa'
                                                                        ,'no_usuario'=>'no_pessoa'
		                               			        ,'nu_cpf_usuario'=>'nu_cpf'))
		                               ->where('compra.co_compra = ?', $coCompra);   
		return $this->getAdapter()->fetchRow($obSelect);                          
	}

	/**
	 * Metodo que lista os dados para o objeto Compra
	 * @param $obTO
	 */
	public function listarTodos( Voitech_TO $obTO ) {
		$obSelect = $this->getAdapter()->select()
		                               ->distinct()
		                               ->from(array('compra'=>'compra'))
		                               ->joinInner(array('tipocompra'=>'tipo_compra')
		                               			  ,'compra.co_tipo_compra = tipocompra.co_tipo_compra'
		                               			  ,array('no_tipo_compra'))
		                               ->joinInner(array('fornecedor'=>'fornecedor')
		                               			  ,'fornecedor.co_fornecedor = compra.co_fornecedor'
		                               			  ,array('no_fornecedor'
		                               			        ,'nu_cnpj'
		                               			        ,'nu_inscricao'
		                               			        ,'ds_endereco'
                                                                        ,'nu_telefone'
                                                                        ,'co_representante'))
		                           	   ->joinInner(array('representante'=>'pessoa')
		                               			  ,'representante.co_pessoa = fornecedor.co_representante'
		                               			  ,array('no_representante'=>'no_pessoa'
		                               			        ,'nu_cpf_representante'=>'nu_cpf'))
		                               ->joinInner(array('usuario'=>'pessoa')
		                               			  ,'usuario.co_pessoa = compra.co_pessoa'
		                               			  ,array('co_usuario'=>'co_pessoa'
                                                                        ,'no_usuario'=>'no_pessoa'
		                               			        ,'nu_cpf_usuario'=>'nu_cpf'));
		if( !empty( $obTO->co_compra ) ) {
                    $obSelect->where('compra.co_compra = ?',$obTO->co_compra);
		}		                               			  		
		
		if( !empty( $obTO->co_fornecedor ) ) {
                    $obSelect->where('fornecedor.co_fornecedor = ?',$obTO->co_fornecedor);
		}
                
                if( !empty( $obTO->no_fornecedor ) ) {
                    $obSelect->where('fornecedor.no_fornecedor like ?',"%".$obTO->no_fornecedor."%");
		}
		
		if( !empty( $obTO->co_tipo_compra ) ) {
                    $obSelect->where('compra.co_tipo_compra = ?',$obTO->co_tipo_compra);
		}

                if( !empty( $obTO->nu_nota ) ) {
                    $obSelect->where('compra.nu_nota like ?',"%".$obTO->nu_nota."%");
		}
                if( !empty( $obTO->dt_inicio )) {
                    $obSelect->where("compra.dt_cadastro >= '" . $obTO->dt_inicio."'");
		}
                if( !empty( $obTO->dt_final ) ) {
                    $obSelect->where("compra.dt_cadastro <= '".$obTO->dt_final."'");
		}
                if( isset($obTO->order) and !empty($obTO->order) ){
                    $obSelect->order($obTO->order);
                }

                if( isset($obTO->limit) and !empty($obTO->limit) ){
                    $obSelect->limit($obTO->limit);
                }
                
		return $this->getAdapter()->fetchAll( $obSelect );
	}
        
        public function listarRelatorioCompra(Voitech_TO $obTO){
            
            $obSubSelect = $this->getAdapter()->select()
                                              ->from('compra',array('co_compra'))
                                              ->columns(array("item_compra.co_produto"
                                                             ,"total_produto"=>new Zend_Db_Expr("(item_compra.co_produto * item_compra.nu_quantidade_produto)")
                                                             ,"total_unitario"=>new Zend_Db_Expr("sum(item_compra.nu_quantidade_unitaria)")))
                                              ->joinInner('item_compra', "item_compra.co_compra = compra.co_compra",'');
            if( isset($obTO->dt_inicio) and !empty($obTO->dt_inicio) ){
                $obSubSelect->where('compra.dt_cadastro >?',$obTO->dt_inicio);
            }
            
            if( isset($obTO->dt_final) and !empty($obTO->dt_final) ){
                $obSubSelect->where('compra.dt_cadastro <?',$obTO->dt_final);
            }
            
            if( isset($obTO->co_fornecedor) and !empty($obTO->co_fornecedor) ){
                $obSubSelect->where('compra.co_fornecedor =?',$obTO->co_fornecedor);
            }
            
            if( isset($obTO->orderSubSelect) and !empty($obTO->orderSubSelect) ){
                $obSubSelect->order($obTO->orderSubSelect);
            }
            
            
            $obSubSelect->group("item_compra.co_produto");
            
            $obSelect = $this->getAdapter()->select()
                                           ->distinct()
                                           ->from('produto',array('co_produto','no_produto' ))
                                           ->columns(array('nu_total_produto'=>new Zend_Db_Expr("(sum(item_compra.total_produto))") 
                                                          ,'nu_total_unitario'=>new Zend_Db_Expr("(sum(item_compra.total_unitario))"
                                                          )))
                                           ->joinInner(array('item_compra'=>$obSubSelect)
                                                      ,"item_compra.co_produto = produto.co_produto"
                                                      ,"");
            if( isset($obTO->co_produto) and !empty($obTO->co_produto) ){
                $obSelect->where('produto.co_produto =?',$obTO->co_produto);
            }
            if( !empty( $obTO->co_categoria ) ) {
                $obSelect->where('produto.co_categoria = ?',$obTO->co_categoria);
		    }
            
            if( isset($obTO->limit) and !empty($obTO->limit) ){
                $obSelect->limit($obTO->limit);
            }
            
            $obSelect->group("produto.co_produto");
            return $this->getAdapter()->fetchAll($obSelect);
        }
        

 
        public function listarRelatorioTipoProdutoCompra(Voitech_TO $obTO){
            
            $obSelect = $this->getAdapter()->select()
                                              ->from(array('produto'=>'produto'))
                                              ->columns(array("item_compra.co_produto"
                                                             ,"co_produto"=>"produto.co_produto"
                                                             ,"co_tipo_produto"=>"produto.co_tipo_produto"
                                                             ,"co_categoria"=>"produto.co_categoria"
                                                             ,"no_tipo_produto"=>"tipo_produto.no_tipo_produto"
                                                             ,"no_produto"=>"produto.no_produto"
                                                             ,"no_categoria"=>"categoria.no_categoria"
                                                             ,"nu_quantidade_produto"=>"item_compra.nu_quantidade_produto"
                                                             ,"dt_cadastro"=>"compra.dt_cadastro"
                                                             ))
                                              ->joinInner('tipo_produto', "produto.co_tipo_produto = tipo_produto.co_tipo_produto",'') 
                                              ->joinInner('item_compra', "produto.co_produto = item_compra.co_produto",'')
                                              ->joinInner('categoria', "produto.co_categoria = categoria.co_categoria",'')              
                                              ->joinInner('compra', "item_compra.co_compra = compra.co_compra",'');
                                              
            if( isset($obTO->dt_inicio) and !empty($obTO->dt_inicio) ){
                $obSelect->where('compra.dt_cadastro >?',$obTO->dt_inicio);
            }
            
            if( isset($obTO->dt_final) and !empty($obTO->dt_final) ){
                $obSelect->where('compra.dt_cadastro <?',$obTO->dt_final);
            }

            $obSelect->order( array( "tipo_produto.no_tipo_produto ASC", "compra.dt_cadastro ASC ") );
            
            return $this->getAdapter()->fetchAll($obSelect);
        }     
    
        public function listarRelatorioFornecedorProdutoCompra(Voitech_TO $obTO){
            
            $obSelect = $this->getAdapter()->select()
                                              ->from(array('compra'=>'compra'))
                                              ->columns(array("item_compra.co_produto"
                                                             ,"co_fornecedor"=>"fornecedor.co_fornecedor"
                                                             ,"no_fornecedor"=>"fornecedor.no_fornecedor"
                                                             ,"co_produto"=>"produto.co_produto"
                                                             ,"no_produto"=>"produto.no_produto"
                                                             ,"co_tipo_produto"=>"tipo_produto.co_tipo_produto"
                                                             ,"no_tipo_produto"=>"tipo_produto.no_tipo_produto"
                                                             ,"no_categoria"=>"categoria.no_categoria"
                                                             ,"nu_quantidade_produto"=>"item_compra.nu_quantidade_produto"
                                                             ,"dt_cadastro"=>"compra.dt_cadastro"
                                                             ))
                                              ->joinInner('fornecedor', "compra.co_fornecedor = fornecedor.co_fornecedor",'') 
                                              ->joinInner('item_compra', "compra.co_compra = item_compra.co_compra",'')
                                              ->joinInner('produto', "item_compra.co_produto = produto.co_produto",'')  
                                              ->joinInner('tipo_produto', "produto.co_tipo_produto = tipo_produto.co_tipo_produto",'')            
                                              ->joinInner('categoria', "produto.co_categoria = categoria.co_categoria",'');
                                              
            if( isset($obTO->dt_inicio) and !empty($obTO->dt_inicio) ){
                $obSelect->where('compra.dt_cadastro >?',$obTO->dt_inicio);
            }
            
            if( isset($obTO->dt_final) and !empty($obTO->dt_final) ){
                $obSelect->where('compra.dt_cadastro <?',$obTO->dt_final);
            }

            $obSelect->order( array( "fornecedor.no_fornecedor ASC", "compra.dt_cadastro ASC") );
            
            return $this->getAdapter()->fetchAll($obSelect);
        }         
        
}